/**
 * 基类
 * 类中data对应page中的data 赋值不需要再调用setData
 * 类中的方法对应page的方法，需要页面传入方法名,在类中进行实现
 *
 */
export default class BaseController {
  /**
   * 构造函数
   * @param {Object} wx 微信小程序对象
   * @param {Object} page 当前页面对象
   * @param {Array} methods 页面函数名数组
   */
  constructor(data, pageController) {
    const self = this;
    Page(
      Object.assign(
        {
          data: data,
        },
        {
          onLoad: function (options) {
            self._page = this;
            if (self._PageController) {
              self._bindProxy();
              self._registerMethods(self._PageController);
              if (self.onLoad) {
                self.onLoad(options);
              }
            }
          },
        }
      )
    );
    this._wx = wx;
  }
  /**
   *
   * @param {*} pageController
   */
  _registerPage(pageController) {
    this._PageController = pageController;
  }
  /**
   * 注册页面方法
   */
  _registerMethods(pageController) {
    Object.getOwnPropertyNames(pageController.prototype).forEach((name) => {
      if (
        name &&
        name[0] !== "_" &&
        name !== "constructor" &&
        name !== "onLoad"
      ) {
        if (pageController.prototype[name]) {
          this._page[name] = pageController.prototype[name].bind(this);
        }
      }
    });
  }
  /**
   * 针对data增加代理
   */
  _bindProxy() {
    const self = this;
    this.data = new Proxy(this._page.data, {
      get(target, key) {
        return target[key];
      },
      set(target, key, value) {
        let obj = {};
        obj[key] = value;
        self._page.setData(obj);
        target[key] = value;
        return true;
      },
    });
  }
}
